#include <iostream>
#include <unordered_map>
using namespace std;

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        
        int left = 0, right = 0, max_len = 0;

        // 定义哈希表用于记录字符出现的位置
        unordered_map<char, int> mp;
        
        // 遍历字符串
        while (right < s.size()) {

            // 如果新字符在窗口中已经存在
            if (mp.find(s[right]) != mp.end() && mp[s[right]] >= left) {
                // 将左边界移动到重复字符的下一个位置
                left = mp[s[right]] + 1;
            }
            // 更新最大长度
            max_len = max(max_len, right - left + 1);
            // 记录字符出现的位置
            mp[s[right]] = right;
            // 将右边界向右移动
            right++;
        }
        return max_len;
    }
};

int main() {
    Solution sol;
    string s = "abcabcdbb";
    int len = sol.lengthOfLongestSubstring(s);
    cout << len << endl;
    return 0;
}